//! # CLI 错误处理
//!
//! 定义 CLI 工具的错误类型和结果类型

use std::io;
use thiserror::Error;

/// CLI 操作结果类型
pub type CliResult<T> = Result<T, CliError>;

/// CLI 错误类型
#[derive(Error, Debug)]
pub enum CliError {
    /// IO 错误
    #[error("文件操作错误: {0}")]
    Io(#[from] io::Error),

    /// 序列化错误
    #[error("序列化错误: {0}")]
    Serde(#[from] serde_json::Error),

    /// YAML 错误
    #[error("YAML 解析错误: {0}")]
    Yaml(#[from] serde_yaml::Error),

    /// TOML 错误
    #[error("TOML 解析错误: {0}")]
    Toml(#[from] toml::de::Error),

    /// HTTP 请求错误
    #[error("HTTP 请求错误: {0}")]
    Reqwest(#[from] reqwest::Error),

    /// Git 操作错误
    #[error("Git 操作错误: {0}")]
    Git(#[from] git2::Error),

    /// 模板渲染错误
    #[error("模板渲染错误: {0}")]
    Template(#[from] handlebars::RenderError),

    /// 配置错误
    #[error("配置错误: {message}")]
    Config { message: String },

    /// 项目错误
    #[error("项目错误: {message}")]
    Project { message: String },

    /// 部署错误
    #[error("部署错误: {message}")]
    Deploy { message: String },

    /// 网络错误
    #[error("网络错误: {message}")]
    Network { message: String },

    /// 验证错误
    #[error("验证错误: {message}")]
    Validation { message: String },

    /// 用户取消操作
    #[error("操作被用户取消")]
    UserCancelled,

    /// 未找到错误
    #[error("未找到: {what}")]
    NotFound { what: String },

    /// 已存在错误
    #[error("已存在: {what}")]
    AlreadyExists { what: String },

    /// 权限错误
    #[error("权限不足: {message}")]
    Permission { message: String },

    /// 通用错误
    #[error("{message}")]
    General { message: String },
}

impl CliError {
    /// 创建配置错误
    pub fn config(message: impl Into<String>) -> Self {
        Self::Config {
            message: message.into(),
        }
    }

    /// 创建项目错误
    pub fn project(message: impl Into<String>) -> Self {
        Self::Project {
            message: message.into(),
        }
    }

    /// 创建部署错误
    pub fn deploy(message: impl Into<String>) -> Self {
        Self::Deploy {
            message: message.into(),
        }
    }

    /// 创建网络错误
    pub fn network(message: impl Into<String>) -> Self {
        Self::Network {
            message: message.into(),
        }
    }

    /// 创建验证错误
    pub fn validation(message: impl Into<String>) -> Self {
        Self::Validation {
            message: message.into(),
        }
    }

    /// 创建未找到错误
    pub fn not_found(what: impl Into<String>) -> Self {
        Self::NotFound { what: what.into() }
    }

    /// 创建已存在错误
    pub fn already_exists(what: impl Into<String>) -> Self {
        Self::AlreadyExists { what: what.into() }
    }

    /// 创建权限错误
    pub fn permission(message: impl Into<String>) -> Self {
        Self::Permission {
            message: message.into(),
        }
    }

    /// 创建通用错误
    pub fn general(message: impl Into<String>) -> Self {
        Self::General {
            message: message.into(),
        }
    }
}